package webui;

import java.io.IOException;
import java.util.*;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import libdb.*;
import libentity.*;


/**
 * Servlet implementation class ListaServlet
 */
public class ListaServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
     
	// ATTRIBUTI DI SERVIZIO 
	DbAccessor gestoreDB = new DbAccessor();
	
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ListaServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    // METODI DI RICEZIONE PARAMETRI
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.processRequest(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.processRequest(request, response);
	}

	// METODI DI AZIONE
	protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		// valutazione se si deve andare in uno dei modi DML
		String parametroSceltaMode = request.getParameter("btnMode");
		String parametroIdRecord = request.getParameter("rdbSelezione");
		
		
		if (parametroSceltaMode != null) {
			if (parametroSceltaMode.equalsIgnoreCase("Insert")) {
				request.setAttribute("localMode", "INSERT");
			}
			if (parametroSceltaMode.equalsIgnoreCase("Update")) {
				if(parametroIdRecord != null) {
					int indiceRecord = 0;
					try {
						indiceRecord = Integer.parseInt(parametroIdRecord);
					}
					catch (Exception e)
					{
						
					}
					gestoreDB.openConnectionToDB();
					Elenco recordSelezionato = gestoreDB.selectByIdFromElenco(indiceRecord);
					request.setAttribute("localElenco", recordSelezionato);
					request.setAttribute("localMode", "UPDATE");
					gestoreDB.updateRecord(recordSelezionato);
					gestoreDB.closeConnectionToDB();
				}
								
			}
			if (parametroSceltaMode.equalsIgnoreCase("Delete")) {
				int indiceRecord = 0;
				indiceRecord = Integer.parseInt(parametroIdRecord);
				
				gestoreDB.openConnectionToDB();
				Elenco recordSelezionato = gestoreDB.selectByIdFromElenco(indiceRecord);
				request.setAttribute("localElenco", recordSelezionato);
				gestoreDB.deleteRecord(indiceRecord);
				request.setAttribute("localMode", "DELETE");
				gestoreDB.closeConnectionToDB();
				
				
			}
			
			
	        request.getRequestDispatcher(
			"detailEditView.jsp").forward(request, response);
		} // end if 
		else {
			
			// verifica parametro hidden eventuale in arrivo dalla form detailEditView
			String parametroMode = request.getParameter("hiddenStatus");
			
			if (parametroMode != null) {
				// scelta in base al valore di tale parametro
				if (parametroMode.equals("INSERT")) {
					this.executeInsert(request, response);
				}
				if (parametroMode.equals("UPDATE")) {
					this.executeUpdate(request, response);
				}
				if (parametroMode.equals("DELETE")) {
					this.executeDelete(request, response);
				}
				
			}
			else {
				this.executeSelect(request, response);
			}
		}
	} // end method

	protected void executeSelect(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// verifica parametro eventuale in arrivo
		String parametroChiave = request.getParameter("txtChiave");
		
		// apre la connessione al DB
		gestoreDB.openConnectionToDB();
		
		// dichiaro il contenitore vuoto per i risultati
		ArrayList<Elenco> listaElencoDaDB;
		
		// verifca se il parametro e' null (non impostato
		if (parametroChiave == null) {		
		
			listaElencoDaDB = gestoreDB.selectAllFromElenco();
		}
		else {
			listaElencoDaDB = gestoreDB.selectByKeyFromElenco("COGNOME", parametroChiave);
		}
		
		//CacheHandler ch = new CacheHandler();
		
		//ArrayList<Elenco> listaElencoDaDB = ch.selectAllFromElenco();
		
        Date dataCorrente = new Date();
        
        String stringaUscita = dataCorrente.toString();
        
        gestoreDB.closeConnectionToDB();
        
        request.setAttribute("dataStringa", stringaUscita); 
        request.setAttribute("listaElenco", listaElencoDaDB);
        		
        request.getRequestDispatcher(
        			"listaView.jsp").forward(request, response);
		
	}

	protected void executeInsert(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// apre la connessione al DB
		gestoreDB.openConnectionToDB();

		// insert into DB
		Elenco myElenco = new Elenco(
				gestoreDB.getMaxID() + 1, 
				request.getParameter("txtCognome"),
				request.getParameter("txtNome"),
				request.getParameter("txtCodice"));
	
		gestoreDB.insertNewRecord(myElenco);
		
		this.executeSelect(request, response);

	}
	
	protected void executeUpdate(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		gestoreDB.openConnectionToDB();
		int indiceRecord =0;
		indiceRecord = Integer.parseInt(request.getParameter("txtID"));
		// insert into DB
		Elenco myElenco = new Elenco( 
				indiceRecord,
				request.getParameter("txtCognome"),
				request.getParameter("txtNome"),
				request.getParameter("txtCodice"));
	
		gestoreDB.updateRecord(myElenco);
		
		
		this.executeSelect(request, response);	
	}
	
	protected void executeDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.executeSelect(request, response);	
		
	}
	
} // end class